package com.cskaoyan.javase.exception._1handle._1catch;

/**
 * @description: 单分支的try..catch
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 处理异常的第一种方式,是捕获它并处理,使用try...catch代码块
 * 语法:
 *      try {
 *          //可能出现异常的，正常的代码逻辑
 *      } catch(要捕捉的异常对象) {
 *          //每一个catch分支对应一个异常处理器
 *          //在catch分支中处理具体类型的代码异常
 *      }
 *
 * 使用try...catch捕获并处理异常:
 *      1,catch(要捕捉的异常对象)
 *          需要注意该对象被捕获后可能在catch代码块中使用,所以它的语法是: 异常类名 异常对象名
 *      2,当catch中要捕获的对象,刚好匹配try代码块中产生的异常时,就会执行catch代码块中的代码
 *          异常被处理后就不会再默认向上抛出了,程序不会终止执行,后面的代码仍然继续执行
 *
 *      3.当catch中不匹配异常时,相当于没写try..catch.异常仍做默认处理,仍然会导致程序终止
 *      4.如果try当中没有异常,catch就不会执行,代码从上到下正常执行
 *      5.try代码块中某行一旦产生异常,后续的代码就不会执行了
 *          所以try中要么不产生异常,要么最多产生一个异常
 *      6.单分支的try..catch,也可以一次处理多个不同的异常
 *          catch代码块语法:
 *          catch(要捕捉的异常类型1 | 要捕捉的异常对类型2 | 要捕捉的异常类型3 ... 对象名){
 *          }
 *          try当中最多产生一个异常,所以一个对象名足够了,不需要很多
 *          |不是逻辑运算符,仅表示同时匹配多个类型
 *       7.如果实在不清楚,try中产生什么异常,可以考虑写一个父类异常在catch中
 *          catch中写异常的父类,子类都可以一起匹配
 *          但是正常开发不推荐这么做,建议细化,不要笼统写父类
 *
 *       8.try...catch会显著的影响代码结构，严重影响代码可读性
 *          所以应该把尽量少的代码放入try中，最好是产生异常的那一行代码
 *
 *       9.try...catch可以用于处理编译时异常,属于在方法内部直接处理
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
       /*
        //运行时异常
        System.out.println("before");
        int[] arr = new int[3];
        try {
            //运行时异常
            //System.out.println(10/0);
            arr = null;
            System.out.println(arr.length);
        } catch (NullPointerException | ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("产生了除0算术异常");
        }

        try {
            System.out.println(10 / 0);
        } catch (ArithmeticException e) {
            System.out.println("发生了运行时异常");
        }
        System.out.println("after");*/


        //编译时异常,对于编译时异常,try...catch是一种处理方式
        Demo d = new Demo();
        //Unhandled exception: java.lang.CloneNotSupportedException
        System.out.println("before");
        try {
            d.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("没有实现Cloneable接口禁止克隆");
        }
        System.out.println("after");
    }
}
